if (self->tree_metadata)
ret_xattrs = g_variant_get_child_value (self->tree_metadata, 4);
- else if (ostree_repo_is_archive (self->repo))
+ else if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE)
{
local_file = _ostree_repo_file_nontree_get_local (self);
if (!ostree_parse_packed_file (local_file, NULL, &ret_xattrs, NULL, cancellable, error))
local_child = get_child_local_file (self->repo, checksum);
- if (ostree_repo_is_archive (self->repo))
+ if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE)
{
if (!ostree_parse_packed_file (local_child, &ret_info, NULL, NULL, cancellable, error))
goto out;
goto out;
}
- if (ostree_repo_is_archive (self->repo))
+ if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE)
{
g_set_error_literal (error, G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
gboolean inited;
GKeyFile *config;
- gboolean archive;
+ OstreeRepoMode mode;
};
static void
return ret;
}
+static gboolean
+keyfile_get_boolean_with_default (GKeyFile *keyfile,
+ const char *section,
+ const char *value,
+ gboolean default_value,
+ gboolean *out_bool,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ GError *temp_error = NULL;
+ gboolean ret_bool;
+
+ ret_bool = g_key_file_get_boolean (keyfile, section, value, &temp_error);
+ if (temp_error)
+ {
+ if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND))
+ {
+ g_clear_error (&temp_error);
+ ret_bool = default_value;
+ }
+ else
+ {
+ g_propagate_error (error, temp_error);
+ goto out;
+ }
+ }
+
+ ret = TRUE;
+ *out_bool = ret_bool;
+ out:
+ return ret;
+}
+
+static gboolean
+keyfile_get_value_with_default (GKeyFile *keyfile,
+ const char *section,
+ const char *value,
+ const char *default_value,
+ char **out_value,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ GError *temp_error = NULL;
+ char *ret_value;
+
+ ret_value = g_key_file_get_value (keyfile, section, value, &temp_error);
+ if (temp_error)
+ {
+ if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND))
+ {
+ g_clear_error (&temp_error);
+ ret_value = g_strdup (default_value);
+ }
+ else
+ {
+ g_propagate_error (error, temp_error);
+ goto out;
+ }
+ }
+
+ ret = TRUE;
+ ot_transfer_out_value(out_value, ret_value);
+ out:
+ g_free (ret_value);
+ return ret;
+}
+
gboolean
ostree_repo_check (OstreeRepo *self, GError **error)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
gboolean ret = FALSE;
char *version = NULL;;
- GError *temp_error = NULL;
+ char *mode = NULL;;
+ gboolean is_archive;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
goto out;
}
- version = g_key_file_get_value (priv->config, "core", "repo_version", &temp_error);
- if (temp_error)
- {
- g_propagate_error (error, temp_error);
- goto out;
- }
+ version = g_key_file_get_value (priv->config, "core", "repo_version", error);
+ if (!version)
+ goto out;
if (strcmp (version, "0") != 0)
{
goto out;
}
- priv->archive = g_key_file_get_boolean (priv->config, "core", "archive", &temp_error);
- if (temp_error)
+ if (!keyfile_get_boolean_with_default (priv->config, "core", "archive",
+ FALSE, &is_archive, error))
+ goto out;
+
+ if (is_archive)
+ priv->mode = OSTREE_REPO_MODE_ARCHIVE;
+ else
{
- if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND))
- {
- g_clear_error (&temp_error);
- }
+ if (!keyfile_get_value_with_default (priv->config, "core", "mode",
+ "bare", &mode, error))
+ goto out;
+
+ if (strcmp (mode, "bare") == 0)
+ priv->mode = OSTREE_REPO_MODE_BARE;
+ else if (strcmp (mode, "archive") == 0)
+ priv->mode = OSTREE_REPO_MODE_ARCHIVE;
else
{
- g_propagate_error (error, temp_error);
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Invalid mode '%s' in repository configuration", mode);
goto out;
}
}
ret = TRUE;
out:
+ g_free (mode);
g_free (version);
return ret;
}
return priv->tmp_dir;
}
-gboolean
-ostree_repo_is_archive (OstreeRepo *self)
+OstreeRepoMode
+ostree_repo_get_mode (OstreeRepo *self)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
g_return_val_if_fail (priv->inited, FALSE);
- return priv->archive;
+ return priv->mode;
}
static gboolean
if (g_cancellable_set_error_if_cancelled (cancellable, error))
return FALSE;
- if (objtype == OSTREE_OBJECT_TYPE_FILE && priv->archive)
+ if (objtype == OSTREE_OBJECT_TYPE_FILE && priv->mode == OSTREE_REPO_MODE_ARCHIVE)
{
if (!ostree_create_temp_regular_file (priv->tmp_dir,
"archive-tmp-", NULL,
char *relpath;
GFile *ret;
- relpath = ostree_get_relative_object_path (checksum, type, priv->archive);
+ relpath = ostree_get_relative_object_path (checksum, type, priv->mode == OSTREE_REPO_MODE_ARCHIVE);
path = g_build_filename (priv->path, relpath, NULL);
g_free (relpath);
ret = ot_gfile_new_for_path (path);
object_path = ostree_repo_get_object_path (self, checksum, OSTREE_OBJECT_TYPE_FILE);
- if (priv->archive)
+ if (priv->mode == OSTREE_REPO_MODE_ARCHIVE)
{
if (!ostree_parse_packed_file (object_path, NULL, &xattrs, &packed_input,
cancellable, error))